%Author: Dominik Schörkhuber
%image: eingabebild
%fill_tresh: zu wieviel % die noten mindestens gefüllt sein muss [0,1]
%radi_tolerance: wie groß die streuung der zu suchenden radi für die hough
%transformation ist
%open_factor: bestimmt die größe des strukturelements mit dem geöffnet wird
%debug: flag für debug modus, [true,false]
function note_recognition(image, fill_thresh,radi_tolerance, open_factor,debug)
    % --- default Parameter ---
    if ~exist('fill_thresh','var')
        fill_thresh = 0.7;
    end
    
    if ~exist('radi_tolerance','var')
        radi_tolerance = 0.05;
    end
    
    if ~exist('open_factor','var')
        open_factor = 0.25;
    end
    
    if ~exist('image','var')
        in = imread('real1.gif');
    else
        in = imread(image);
    end
    
    if ~exist('debug','var')
        debug = false;
    end
    % end default parameter

    %Zeichen fuer die TABs
    glyphs{1} = imread('glyphs/0.png');
    glyphs{2} = imread('glyphs/1.png');
    glyphs{3} = imread('glyphs/2.png');
    glyphs{4} = imread('glyphs/3.png');
    
    A = []; %midiarray
   
    
    
    in = im2double(in);
    in = mi2bw(in,0.9);
    l = seperateLines(in); %teilen der notenzeilen in einzelbilder
    resultImage=ones(10,length(l(:,:,1)));
    resultImage=resultImage*255;
    num = size(l,3); %anzahl der notenzeilen/einzelbilder
    
    for i=1:num
     %for i=4:4
        plotline = l(:,:,i);
        line = l(:,:,i);
        [begin ende lineheight] = getLineHeight(line); %berechnen der zeilenhöhe
        if lineheight == 0
            continue % die zeile wird verworfen wenn der abstand der notenlinien 0 ist (z.b. liedtext)
        end
        
        line = removeLines(line,'h'); % entfernen der horizontalen linien
        line = removeLines(line,'v'); % entfernen der vertikalen linien
        
        %line = imopen(line,strel('disk',round(lineheight*open_factor)));
        line = miopen(line,mimakedisk(round(lineheight*open_factor)));
        
        if debug
            figure;
            imshow([plotline;line]);
        end
      resultImage=cat(1,resultImage,plotline*255);
        [x,y] = circles(line,lineheight,radi_tolerance); %houghtransformation
        %disp([x,y]);
        hold on;
        
        p_all = zeros(numel(x),1);
        notenPos=zeros(1,length(x));
        for n=1:numel(x)
            %p_all(n)=filled(line,x(n),y(n),lineheight); %überprüft ob note im morphologisch veränderten bild 'line' gefüllt ist
           % if(p_all(n) > fill_thresh) %wenn der füllgrad über dem threshold ist wird der notenwert geplottet
                notenPos(n)=(y(n)-begin)/(lineheight*0.5);
              %  disp(notenPos(n));
              %  wert = notenwert(notenPos(n)); %notenwerte ermitteln
              disp(n); 
              if n==11
                    disp(notenPos);
              end
            %s    text(x(n),size(plotline,1),wert,'FontSize',lineheight);
           % end
            
            if debug
                plot(x(n),y(n),'go');
                text(x(n)+5,y(n)+5,num2str(p_all(n)),'FontSize',8);
            end
        end
        hold off;
        disp(notenPos);
        %TABs schreiben
      %  pos=[55 60 1; 55 80 2; 35 100 1];
            pos=zeros(length(x),3);
           
            pos(:,2)=x;
            pos(:,3)=1;
            pos(:,1)=20;
            for n=1:length(x)
             %  disp(notenPos(n));
                notenPos(n)=round(notenPos(n));
               if notenPos(n)>10
                   notenPos(n)=10;
               end
               switch notenPos(n)
                   case 10 
                        %c 60 middle c
                        A(end+1)=60;
                        pos(n,1)=100;
                        pos(n,3)=4;
                   case 9
                       %d 62
                       A(end+1)=62;
                       pos(n,1)=80;
                       pos(n,3)=1;
                   case 8
                       %e 64
                       A(end+1)=64;
                       pos(n,1)=80;
                       pos(n,3)=3;
                   case 7
                      %f 65
                       A(end+1)=65;
                       pos(n,1)=80;
                       pos(n,3)=4;
                   case 6
                      %g 67
                       A(end+1)=67;
                       pos(n,1)=60;
                       pos(n,3)=1;
                   case 5
                       %a 69
                       A(end+1)=69;
                       pos(n,1)=60;
                       pos(n,3)=3;
                   case 4
                       %b/h 71
                       A(end+1)=71;
                       pos(n,1)=40;
                       pos(n,3)=1;
                   case 3
                      %c 72
                       A(end+1)=72;
                       pos(n,1)=40;
                       pos(n,3)=2;
                   case 2
                       %d 74
                       A(end+1)=74;
                       pos(n,1)=40;
                       pos(n,3)=4;
                   case 1
                       %e 76
                       A(end+1)=76;
                       pos(n,1)=20;
                       pos(n,3)=1;
                   case 0
                       %f 77
                       A(end+1)=77;
                       pos(n,1)=20;
                       pos(n,3)=2;
               end
            end
            pos(:,1)=pos(:,1)-10;
            
            
           tab=render([130 length(line)], [20 length(line)-10], [20 40 60 80 100 120], pos, glyphs);
           %subplot(2*num,1,2*i);
           %imshow(tab);
           resultImage=cat(1,resultImage,tab);
           white=ones(10, length(line));
           white=white*255;
           resultImage=cat(1,resultImage,white);
    end
    
    figure;
    imshow(resultImage);
    
    N =size(A);
		
		N=N(2);  % number of notes
		
		
		p=N/2;
		M = zeros(N,6);
		M(:,1) = 1;         % alles in track 1
		M(:,2) = 1;         % alles in channel 1
		for i=1:N
        M(i,3)=A(i);
		end
		M(:,4) = 80';  % lautstärke 80
		M(:,5) = (.5:.5:p)'; % jede note startet 0,5 sek nach dem vorgaenger
		M(:,6) = M(:,5) + .5;   % jede note spielt 0,5 sek
		
		midi_new = matrix2midi(M);
		rand=randi([1, 10000])
		filename=strcat(num2str(rand),'testout.mid') ;
		writemidi(midi_new, filename);
 
end












